package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 线程安全的集合foreach方法和增删元素是互斥的，但是新循环(迭代器)则不是。
 * @author 范传奇
 *
 */
public class ForeachDemo2 {
	public static void main(String[] args) {
		//创建一个线程安全的集合
		List<String> list = Collections.synchronizedList(new ArrayList<>());
		list.add("1");
		list.add("2");
		list.add("3");
		list.add("4");
		list.add("5");
		System.out.println(list);
		Thread t1 = new Thread() {
			public void run() {
				//新循环遍历(迭代器)
//				for (String s : list) {
//					System.out.println(getName()+":"+s);
//					try {
//						Thread.sleep(1000);
//					} catch (InterruptedException e) {
//					}
//				}
				//使用forEach遍历 
				list.forEach(//forEach会和下面线程调用add方法互斥保证并发安全
						(e)->{
							System.out.println(getName()+":"+e);
							try {
								Thread.sleep(1000);
							} catch (InterruptedException e1) {
							}
						}
				);
				System.out.println(getName()+":遍历集合完毕!");
			}
		};
		
		Thread t2 = new Thread() {
			public void run() {
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
				}
				System.out.println(getName()+":开始添加新元素");
				list.add("6");
				System.out.println(getName()+":新元素添加完毕!");
				System.out.println(list);
			}
		};
		t1.start();
		t2.start();
	}
}












